1// Eclipse by OnTake
2// Version 1
3// 22/12/2021 - 20:56 UTC
4// A pencil-sharpening plane.
5
6
7include <BOSL/constants.scad>
8use <BOSL/masks.scad>
9
10renderResolution = 10;
11
12sharpenerBodySize = [60,30,10]; // mm
13sharpenerAngle = 45; // °
14sharpenerScrewDiameter = 2; //mm
15ScrewHeadDiameter = 4; // mm
16ScrewHeadHeight = 5; //mm : Use a flat head screw or it's going to get ugly.
17bladeDimensions = [23,7,1]; //mm : KUM Spare Blades for Standard Sharpeners
18bladeTolerances = 0.1; //mm
19bladeAlignOffset = [0,0,-1.1]; // mm
20bladeClearanceAlignOffset = [-6,0,0]; //mm
21bladeClearanceExtraY = 6; //mm
22ScrewHeadAlignOffset = [0,0,4.5]; // mm
23bevelRadius = 2; // mm
24textAValue = "Eclipse";
25textAFont = "Arial:style=Bold";
26textAHeight = 1;
27textASize = 5; // mm
28textAOffset = [15,0,0.4]; // mm
29textBValue = "by OnTake";
30textBFont = "Arial:style=Bold";
31textBHeight = 1;
32textBSize = 3.5; // mm
33textBOffset = [22,0,0.4]; // mm
34
35difference() {
36 // Body shape
37 cube(center = false, size = sharpenerBodySize);
38 // Blade shape
39 translate([sharpenerBodySize.x/2,sharpenerBodySize.y/2,10])
40 rotate([0,sharpenerAngle,0])
41 translate(bladeAlignOffset)
42 cube(center = true, size = [bladeDimensions.y+bladeTolerances,bladeDimensions.x+bladeTolerances,20]);
43 // Blade clearance shape
44 translate([sharpenerBodySize.x/2,sharpenerBodySize.y/2,10])
45 rotate([0,sharpenerAngle,0])
46 translate(bladeAlignOffset)
47 translate(bladeClearanceAlignOffset)
48 cube(center = true, size = [bladeDimensions.y+bladeTolerances+bladeClearanceExtraY,bladeDimensions.x+bladeTolerances,20]);
49 // Screw hole shape
50 translate([sharpenerBodySize.x/2,sharpenerBodySize.y/2,10])
51 rotate([0,sharpenerAngle,0])
52 translate(bladeAlignOffset)
53 translate([0,0,-20])
54 cylinder(h = 20, r1 = sharpenerScrewDiameter/2, r2 = sharpenerScrewDiameter/2, center = false, $fn=10*renderResolution);
55 // Screw head hole shape
56 translate([sharpenerBodySize.x/2,sharpenerBodySize.y/2,10])
57 rotate([0,sharpenerAngle,0])
58 translate(bladeAlignOffset)
59 translate([0,0,-20])
60 translate(ScrewHeadAlignOffset)
61 cylinder(h = ScrewHeadHeight, r1 = ScrewHeadDiameter/2, r2 = ScrewHeadDiameter/2, center = false, $fn=10*renderResolution);
62 // Bevels
63 // Height Filet
64 translate([0,0,sharpenerBodySize.z]) fillet_mask_z(l=sharpenerBodySize.x*3, r=bevelRadius, $fn=10*renderResolution);
65 translate([sharpenerBodySize.x,0,sharpenerBodySize.z]) fillet_mask_z(l=sharpenerBodySize.x*3, r=bevelRadius, $fn=10*renderResolution);
66 translate([0,sharpenerBodySize.y,sharpenerBodySize.z]) fillet_mask_z(l=sharpenerBodySize.x*3, r=bevelRadius, $fn=10*renderResolution);
67 translate(sharpenerBodySize) fillet_mask_z(l=sharpenerBodySize.x*3, r=bevelRadius, $fn=10*renderResolution);
68 // Top Start
69 // First Corner
70 translate([0,0,sharpenerBodySize.z]) fillet_mask_x(l=sharpenerBodySize.x*3, r=bevelRadius, $fn=10*renderResolution);
71 translate([0,0,sharpenerBodySize.z]) fillet_mask_y(l=sharpenerBodySize.x*3, r=bevelRadius, $fn=10*renderResolution);
72 // Opposite Corner
73 translate(sharpenerBodySize) fillet_mask_x(l=sharpenerBodySize.x*3, r=bevelRadius, $fn=10*renderResolution);
74 translate(sharpenerBodySize) fillet_mask_y(l=sharpenerBodySize.x*3, r=bevelRadius, $fn=10*renderResolution);
75 // Corner Filet
76 translate([0,0,sharpenerBodySize.z]) fillet_corner_mask(r=bevelRadius, $fn=10*renderResolution);
77 translate([sharpenerBodySize.x,0,sharpenerBodySize.z]) fillet_corner_mask(r=bevelRadius, $fn=10*renderResolution);
78 translate([0,sharpenerBodySize.y,sharpenerBodySize.z]) fillet_corner_mask(r=bevelRadius, $fn=10*renderResolution);
79 translate(sharpenerBodySize) fillet_corner_mask(r=bevelRadius, $fn=10*renderResolution);
80 // Top End
81 // Bottom Start
82 // First Corner
83 translate([0,0,0]) fillet_mask_x(l=sharpenerBodySize.x*3, r=bevelRadius, $fn=10*renderResolution);
84 translate([0,0,0]) fillet_mask_y(l=sharpenerBodySize.x*3, r=bevelRadius, $fn=10*renderResolution);
85 // Opposite Corner
86 translate([sharpenerBodySize.x,sharpenerBodySize.y,0]) fillet_mask_x(l=sharpenerBodySize.x*3, r=bevelRadius, $fn=10*renderResolution);
87 translate([sharpenerBodySize.x,sharpenerBodySize.y,0]) fillet_mask_y(l=sharpenerBodySize.x*3, r=bevelRadius, $fn=10*renderResolution);
88 // Corner Filet
89 translate([0,0,0]) fillet_corner_mask(r=bevelRadius, $fn=10*renderResolution);
90 translate([sharpenerBodySize.x,0,0]) fillet_corner_mask(r=bevelRadius, $fn=10*renderResolution);
91 translate([0,sharpenerBodySize.y,0]) fillet_corner_mask(r=bevelRadius, $fn=10*renderResolution);
92 translate([sharpenerBodySize.x,sharpenerBodySize.y,0]) fillet_corner_mask(r=bevelRadius, $fn=10*renderResolution);
93 // Bottom End
94}
95// TextA
96translate([sharpenerBodySize.x/2,sharpenerBodySize.y/2,sharpenerBodySize.z])
97translate(textAOffset)
98rotate([0,0,90])
99linear_extrude(height=textAHeight)
100text(textAValue,font=textAFont,size=textASize,valign="center",halign="center",$fn=10*renderResolution);
101// TextB
102translate([sharpenerBodySize.x/2,sharpenerBodySize.y/2,sharpenerBodySize.z])
103translate(textBOffset)
104rotate([0,0,90])
105linear_extrude(height=textBHeight)
106text(textBValue,font=textBFont,size=textBSize,valign="center",halign="center",$fn=10*renderResolution);